<?php 
namespace app\lib\exception;

use Exception;
// use think\Exception;   // 版本 7.0 的不能捕获自定义的异常 || 5.6版本可以
use think\Request;
use think\exception\Handle; // 基础tp5的异常处理类
use think\Log;

class ExceptionHandler extends Handle
{
	private $code;
	private $msg;
	private $errorCode;
	/**
	 * 使用之前，需要在config.php文件中指定，异常处理类的位置
	 * 异常处理handle类 留空使用 \think\exception\Handle
     * 'exception_handle'       => 'app\lib\exception\ExceptionHandler',
	 * @param  Exception $e [description]
	 * @return [type]       [description]
	 */
	public function render(Exception $e)
	{
		if ($e instanceof BaseException) {
			// 如果是自定义的错误异常
			$this->code = $e->code;
			$this->msg = $e->msg;
			$this->errorCode = $e->errorCode;
		} else {
			if(config("app_debug")) { // 在开启错误调试模式下，显示tp自带的错误显示
				return parent::render($e); 
			} else {
				$this->code = 500;
				$this->msg = '服务器内部错误';
				$this->errorCode = 999;
				/**
				 * 日志记录
				 * 1. 关闭tp5的自动记录
				 * 		config.php  log  'type' => 'test'  将file改为test 
				 * 2. 自定义函数 -- 手动、有选择的记录
				 */
				$this->recordErrorLog($e);
			}
		}
		$request = Request::instance();
		$result = [
			'msg' => $this->msg,
			'error_code' => $this->errorCode,
			'request_url' => $request->url() // 获取当前的请求地址
		];
		return json($result, $this->code);
	}

	/**
	 * 记录error错误
	 * @param  Exception $e [description]
	 * @return [type]       [description]
	 */
	private function recordErrorLog(Exception $e)
	{
		// 由于配置文件config.php中已经关闭了日志记录，所以这里在记录之前，需初始化
		Log::init([
			'type'	=> 'File',
			'path'  => LOG_PATH,
			'level' => ['error'] // 只记录error级别的错误
		]);
		Log::record($e->getMessage(), 'error');
	}
}